import axios from 'axios';
import router from '@/router';
// import StatusInit from '@/utils/status/StatusInit' // 状态码的策略模式

const CancelToken: any = axios.CancelToken; // axios 的取消请求

//后台还没有token
// let token = localStorage.getItem('token');

const service = axios.create({
  baseURL:'http://120.78.234.204', // 可以不需要
  timeout: 5000,  // 超时时间
  withCredentials: true,
  headers: {
    // 'version': '1.0.1', // 接口的版本号
    // 'Authorization': 'Bearer ' + token, // 向后台发送的token
    get: {
      'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
    },
    post: {
      'Content-Type': 'application/json;charset=utf-8'
    }
  },
  validateStatus () {
    return true;
  },

});

// 防止重复提交 利用axios的cancelToken
let pending: any[] = []; // 声明一个数组用于存储每个axios请求的取消函数和axios标识

/**
 * 取消重复请求
 * @param config
 * @param f
 */
const removePending: any = (config: any, f: any) => {
  const flgUrl = config.url;
  if ( pending.indexOf(flgUrl) !== -1 ) {
    if ( f ) {
      f('取消重复请求');
    } else {
      pending.splice(pending.indexOf( flgUrl ), 1); // 删除记录
    }
  } else {
    if ( f ) {
      pending.push( flgUrl );
    }
  }
}

/**
 * 请求拦截器
 */
service.interceptors.request.use(
  (config: any) => {
    if ( !config.neverCancel ) {
      // 生成canalToken
      config.cancelToken = new CancelToken((c: any) => {
        removePending(config, c);
      });
    }
    // 添加请求头以及其他逻辑处理

    // const token = getToken();
    //当存在token时，将token加到请求头上面
    // if (token) {
    //   config.headers.token = token;//携带在请求头中
    //   // config.params = { 'token': token };//携带在参数中
    // }
    return config;
  },
  (error: any) => {
    Promise.resolve(error);
  }
);

/**
 * 响应拦截器
 */
service.interceptors.response.use(
  (response: any) => {
    // removePending( response.config );
    const res = response.data;
    // 后端status错误判断
    if ( res.status === 200 ) {
      // let status = new StatusInit();
      // status.init(res.status, res.msg, res);
      return Promise.resolve(res);
    } else {
      // 错误状态码处理
      return Promise.reject(res);
    }
  },
  (error: any) => {
    // Http错误状态码处理
    return Promise.reject(error);
  }
);


// export default service;

let baseUrl: string;
export class Request{
  protected commonUrl: string = "";
  public baseUrl: string = baseUrl;

  public get(url: string, data?: any): Promise<any> {
    return service.get(this.commonUrl + url, data);
  }

  public post(url: string, data: any): Promise<any> {
    return service.post(this.commonUrl + url, data);
  }

  //formdata格式
  public FormPost(url: string, data?: any): Promise<any> {
    return service.post(this.commonUrl + url, data, {
      headers: {
        "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
      },
    });
  }
}